#!/bin/bash
set -euo pipefail

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 本地数据库默认配置
LOCAL_DB_HOST="localhost"
LOCAL_DB_PORT="3306"
LOCAL_DB_USER="root"
LOCAL_DB_PASSWORD=""
LOCAL_DB_NAME="fastapi_auth"
BACKUP_DIR="./sql_exports/backups"

usage() {
  cat <<'USAGE'
用法: import_to_local.sh [选项] <sql_file_path>

必填参数:
  sql_file_path        要导入的SQL文件路径（支持 .sql 和 .sql.gz）

可选参数:
  -H <host>           本地MySQL主机，默认 localhost
  -P <port>           本地MySQL端口，默认 3306
  -u <user>           本地MySQL用户，默认 root
  -p <password>       本地MySQL密码（不传则安全提示输入）
  -d <database>       本地MySQL数据库名，默认 fastapi_auth
  --no-backup         跳过备份当前数据库
  --drop-create       导入前删除并重建数据库（危险操作）
  -h, --help          显示帮助

示例:
  ./import_to_local.sh ./sql_exports/prod/prod_fastapi_auth_20250108_180000.sql
  ./import_to_local.sh ./backup.sql.gz --no-backup
  ./import_to_local.sh ./prod_data.sql -p 'mypassword' --drop-create
USAGE
}

# 默认选项
ENABLE_BACKUP="true"
DROP_CREATE="false"
SQL_FILE=""

# 简单的参数解析（兼容 macOS）
while [[ $# -gt 0 ]]; do
  case $1 in
    -H)
      LOCAL_DB_HOST="$2"
      shift 2
      ;;
    -P)
      LOCAL_DB_PORT="$2"
      shift 2
      ;;
    -u)
      LOCAL_DB_USER="$2"
      shift 2
      ;;
    -p)
      LOCAL_DB_PASSWORD="$2"
      shift 2
      ;;
    -d)
      LOCAL_DB_NAME="$2"
      shift 2
      ;;
    --no-backup)
      ENABLE_BACKUP="false"
      shift
      ;;
    --drop-create)
      DROP_CREATE="true"
      shift
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    -*)
      echo -e "${RED}未知选项: $1${NC}"
      usage
      exit 1
      ;;
    *)
      # 第一个非选项参数作为SQL文件
      if [[ -z "$SQL_FILE" ]]; then
        SQL_FILE="$1"
      fi
      shift
      ;;
  esac
done

# 检查SQL文件参数
if [[ -z "$SQL_FILE" ]]; then
    echo -e "${RED}错误：请提供SQL文件路径${NC}"
    usage
    exit 1
fi

# 检查SQL文件是否存在
if [ ! -f "$SQL_FILE" ]; then
    echo -e "${RED}错误：SQL文件不存在: $SQL_FILE${NC}"
    exit 1
fi

# 检查依赖
command -v mysql >/dev/null 2>&1 || { echo -e "${RED}未找到 mysql 命令，请先安装 MySQL 客户端${NC}"; exit 1; }
command -v mysqldump >/dev/null 2>&1 || { echo -e "${RED}未找到 mysqldump 命令，请先安装 MySQL 客户端${NC}"; exit 1; }

# 检查是否是压缩文件
if [[ "$SQL_FILE" == *.gz ]]; then
    command -v gunzip >/dev/null 2>&1 || { echo -e "${RED}文件是 .gz 格式但未找到 gunzip 命令${NC}"; exit 1; }
fi

# 安全读取密码
if [[ -z "${LOCAL_DB_PASSWORD}" ]]; then
    read -r -s -p "请输入本地MySQL密码 (${LOCAL_DB_USER}@${LOCAL_DB_HOST}): " LOCAL_DB_PASSWORD
    echo ""
fi

echo -e "${BLUE}=== 导入到本地MySQL数据库 ===${NC}"
echo -e "${YELLOW}SQL文件: $SQL_FILE${NC}"
echo -e "${YELLOW}目标: ${LOCAL_DB_USER}@${LOCAL_DB_HOST}:${LOCAL_DB_PORT}/${LOCAL_DB_NAME}${NC}"

# 检查本地数据库连接
echo -e "${YELLOW}检查数据库连接...${NC}"
if ! mysql -h"$LOCAL_DB_HOST" -P"$LOCAL_DB_PORT" -u"$LOCAL_DB_USER" -p"$LOCAL_DB_PASSWORD" -e "SELECT 1;" >/dev/null 2>&1; then
    echo -e "${RED}无法连接到本地数据库，请检查连接参数${NC}"
    exit 1
fi

# 检查数据库是否存在
DB_EXISTS=$(mysql -h"$LOCAL_DB_HOST" -P"$LOCAL_DB_PORT" -u"$LOCAL_DB_USER" -p"$LOCAL_DB_PASSWORD" -e "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='$LOCAL_DB_NAME';" --skip-column-names 2>/dev/null || true)

if [[ "$DROP_CREATE" == "true" ]]; then
    echo -e "${YELLOW}删除并重建数据库 $LOCAL_DB_NAME ...${NC}"
    mysql -h"$LOCAL_DB_HOST" -P"$LOCAL_DB_PORT" -u"$LOCAL_DB_USER" -p"$LOCAL_DB_PASSWORD" -e "DROP DATABASE IF EXISTS $LOCAL_DB_NAME; CREATE DATABASE $LOCAL_DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
elif [[ -z "$DB_EXISTS" ]]; then
    echo -e "${YELLOW}创建数据库 $LOCAL_DB_NAME ...${NC}"
    mysql -h"$LOCAL_DB_HOST" -P"$LOCAL_DB_PORT" -u"$LOCAL_DB_USER" -p"$LOCAL_DB_PASSWORD" -e "CREATE DATABASE $LOCAL_DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
fi

# 备份当前数据库（如果存在且未禁用备份）
if [[ "$ENABLE_BACKUP" == "true" && -n "$DB_EXISTS" ]]; then
    mkdir -p "$BACKUP_DIR"
    BACKUP_FILE="$BACKUP_DIR/local_backup_$(date +%Y%m%d_%H%M%S).sql"
    echo -e "${YELLOW}备份当前本地数据库到: $BACKUP_FILE${NC}"
    mysqldump -h"$LOCAL_DB_HOST" -P"$LOCAL_DB_PORT" -u"$LOCAL_DB_USER" -p"$LOCAL_DB_PASSWORD" \
        --single-transaction --routines --triggers --events \
        "$LOCAL_DB_NAME" > "$BACKUP_FILE"
    echo -e "${GREEN}✓ 备份完成${NC}"
fi

# 导入SQL文件
echo -e "${YELLOW}导入SQL文件...${NC}"
if [[ "$SQL_FILE" == *.gz ]]; then
    # 压缩文件
    gunzip -c "$SQL_FILE" | mysql -h"$LOCAL_DB_HOST" -P"$LOCAL_DB_PORT" -u"$LOCAL_DB_USER" -p"$LOCAL_DB_PASSWORD" "$LOCAL_DB_NAME"
else
    # 普通SQL文件
    mysql -h"$LOCAL_DB_HOST" -P"$LOCAL_DB_PORT" -u"$LOCAL_DB_USER" -p"$LOCAL_DB_PASSWORD" "$LOCAL_DB_NAME" < "$SQL_FILE"
fi

if [ $? -eq 0 ]; then
    echo -e "${GREEN}✓ SQL文件导入成功${NC}"
    
    # 验证导入结果
    echo -e "${YELLOW}验证导入结果...${NC}"
    TABLE_COUNT=$(mysql -h"$LOCAL_DB_HOST" -P"$LOCAL_DB_PORT" -u"$LOCAL_DB_USER" -p"$LOCAL_DB_PASSWORD" -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$LOCAL_DB_NAME';" --skip-column-names 2>/dev/null | tail -1)
    echo -e "${GREEN}✓ 数据库表数量: $TABLE_COUNT${NC}"
    
    # 检查Alembic版本
    ALEMBIC_VERSION=$(mysql -h"$LOCAL_DB_HOST" -P"$LOCAL_DB_PORT" -u"$LOCAL_DB_USER" -p"$LOCAL_DB_PASSWORD" -e "SELECT version_num FROM $LOCAL_DB_NAME.alembic_version LIMIT 1;" --skip-column-names 2>/dev/null || echo "无")
    echo -e "${GREEN}✓ Alembic版本: $ALEMBIC_VERSION${NC}"
    
else
    echo -e "${RED}✗ SQL文件导入失败${NC}"
    if [[ "$ENABLE_BACKUP" == "true" && -f "$BACKUP_FILE" ]]; then
        echo -e "${YELLOW}可以使用备份文件恢复: $BACKUP_FILE${NC}"
    fi
    exit 1
fi

echo -e "${BLUE}=== 导入完成 ===${NC}"
echo -e "${GREEN}现在你可以运行 'alembic current -v' 检查数据库版本状态${NC}"